﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ModeloMagiPack.Entidades;
using DALMagiPack.Funcionalidad;

namespace BLLMagiPack.Managers
{
    public class BLLCliente:BLLMagiPack
    {
        public void CrearCliente(Cliente nuevoCliente)
        {
            DALMagiPack<Cliente> dal = new DALMagiPack<Cliente>();

            if (TraerClientes(nuevoCliente.Nombre).Count > 0)
                throw new BLLMagiPackException("Ya existe un cliente con el nombre " + nuevoCliente.Nombre);

            dal.Insertar(nuevoCliente);
        }

        public void ModificarCliente(Cliente cliente)
        {
            DALMagiPack<Cliente> dal = new DALMagiPack<Cliente>();
            Cliente clienteViejo = TraerCliente((int)cliente.IdCliente);

            if(!clienteViejo.Nombre.Equals(cliente.Nombre) && TraerClientes(cliente.Nombre).Count > 0)
                throw new BLLMagiPackException("Ya existe un cliente con el nombre " + cliente.Nombre);

            dal.Modificar(cliente);
        }

        public void EliminarCliente(Cliente cliente)
        {
            DALMagiPack<Cliente> dal = new DALMagiPack<Cliente>();
            List<string> elementos = new List<string>();

            if (new BLLCheque().TraerChequesPorCliente(cliente.IdCliente).Count > 0)
                elementos.Add("cheques");
            if (new BLLOrden().PoseeOrdenesPorCliente((int)cliente.IdCliente))
                elementos.Add("órdenes");

            ValidarDependencia(elementos, "cliente", cliente.Nombre, true);
            dal.Eliminar(cliente);
        }

        public List<Cliente> TraerClientes()
        {
            DALMagiPack<Cliente> dal = new DALMagiPack<Cliente>();

            return dal.Traer(new Cliente(), new List<Filtro>());
        }

        public List<Cliente> TraerClientes(string nombre)
        {
            DALMagiPack<Cliente> dal = new DALMagiPack<Cliente>();
            Cliente parametrosFiltro = new Cliente();
            List<Filtro> filtros = new List<Filtro>();

            if (nombre.Length > 0)
            {
                parametrosFiltro.Nombre = nombre;
                filtros.Add(new Filtro() { Columna = NombresColumnas.Nombre, Tipo = TipoFiltro.Like });
            }

            return dal.Traer(parametrosFiltro, filtros);
        }

        public List<Cliente> TraerClientesPorLocalidad(int idLocalidad)
        {
            DALMagiPack<Cliente> dal = new DALMagiPack<Cliente>();
            Cliente parametrosFiltro = new Cliente() { IdLocalidad = idLocalidad };
            List<Filtro> filtros = new List<Filtro>() { new Filtro() { Columna = NombresColumnas.IdLocalidad, Tipo = TipoFiltro.Equal } };

            return dal.Traer(parametrosFiltro, filtros);
        }

        public bool PoseeClientesPorVendedor(int idVendedor)
        {
            DALMagiPack<Cliente> dal = new DALMagiPack<Cliente>();
            Cliente parametrosFiltro = new Cliente() { IdVendedor = idVendedor };
            List<Filtro> filtros = new List<Filtro>() { new Filtro() { Columna = NombresColumnas.IdVendedor, Tipo = TipoFiltro.Equal } };
            int cantidad = dal.Contar(parametrosFiltro, filtros);

            return cantidad > 0;
        }

        public Cliente TraerCliente(int? idCliente)
        {
            DALMagiPack<Cliente> dal = new DALMagiPack<Cliente>();
            Cliente parametrosFiltro = new Cliente() { IdCliente = idCliente };
            List<Filtro> opciones = new List<Filtro>() { new Filtro() { Columna = NombresColumnas.IdCliente, Tipo = TipoFiltro.Equal } };

            return dal.Traer(parametrosFiltro, opciones).FirstOrDefault();
        }
    }
}
